import 'dart:io';

/**
 * 异步编程
 * 内容:
 * 1.同步会阻塞程序运行
 * 2.使用 future 后置异步处理
 * 3.future 链式调用
 * 4.使用异步等待 async await
 */
void main() {
  print('========== 执行 ==========');

  // 4.使用异步等待 async await
  doLogin();
  // 原始写法
  login().then((token) {
    print(token);
    getUserInfo().then((userinfo) {
      print(userinfo);
    });
  });

  // 3.future 链式调用
  getNetWorkDataFuture2().then((result) {
    print(result);
  }).catchError((e) {
    print('错误原因：$e');
  });

  // 2.使用 future 后置异步处理
  getNetWorkDataFuture().then((result) {
    print(result);
  });

  // 1.同步会阻塞程序运行
  String data = getNetWorkData();
  print(data);

  print('========== 结束 ==========');
}

doLogin() async {
  String token = await login();
  print(token);
  String userInfo = await getUserInfo();
  print(userInfo);
}

// 使用异步等待 async await
// 场景：登录获取用户信息
login() {
  return Future(() {
    sleep(Duration(seconds: 3));
    return 'token';
  });
}

getUserInfo() {
  return Future(() {
    sleep(Duration(seconds: 3));
    return 'Jack 18';
  });
}

// future链式调用
getNetWorkDataFuture2() {
  return Future(() {
    sleep(Duration(seconds: 4));
    throw Exception('网络异常');
  });
}

// future异步
getNetWorkDataFuture() {
  return Future(() {
    sleep(Duration(seconds: 3));
    return 'Future网络数据';
  });
}

// 同步方法
String getNetWorkData() {
  sleep(Duration(seconds: 2));
  return '网络数据';
}
